package com.alks.function.mapper.pcfactoryquery;

import com.alks.entity.data.entity.PcCuttingCollectDetail;
import com.alks.entity.data.entity.PcCuttingLsPart;
import com.alks.function.data.dto.pcfactoryquery.PcCuttingPartDto;
import com.alks.function.data.dto.pcfactoryquery.PcCuttingPartSpDto;
import com.alks.function.data.dto.stockdept.pcfactorystockwork.CutScanLotDto;
import com.alks.function.data.dto.stockdept.pcfactorystockwork.CuttingRecDetDto;
import com.alks.function.data.dto.stockdept.pcfactorystockwork.CuttingRecTempDto;
import com.alks.function.data.request.factoryquery.CuttingPartRequest;
import com.alks.function.data.request.factoryquery.CuttingPartSpRequest;
import com.alks.function.data.request.stockdept.pcfactorystockwork.CuttingRceIoBackRequest;
import com.alks.function.data.request.stockdept.pcfactorystockwork.CuttingRecTempRequest;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 冲裁出入库表 Mapper 接口
 * </p>
 *
 * @author ms
 * @since 2023-08-07
 */
public interface FT_QR_PcCuttingLsPartMapper extends BaseMapper<PcCuttingLsPart> {

    //MS TODO 2024/6/30 :  高频和配套中心的派工时间 以及 全部的采集时间
    /**
     * 冲裁账目明细
     * @param request   查询条件
     * @param companyId 公司id
     * @return 冲裁账目明细
     */
    List<PcCuttingPartDto> queryCuttingPartDetail(@Param("request") CuttingPartRequest request, @Param("companyId") String companyId);

    /**
     * 冲裁配套状况查询
     * @param request   查询条件
     * @param companyId 公司id
     * @return 冲裁配套状况
     */
    List<PcCuttingPartSpDto> queryCuttingPartSpHead(@Param("request") CuttingPartSpRequest request, @Param("companyId") String companyId);

    /**
     * 加工收发基础数据查询
     *
     * @param request 查询条件
     * @param processCode 工序
     * @param companyId 公司id
     * @return 加工收发基础数据
     */
    List<CuttingRecTempDto> cuttingRecTempQuery(@Param("request") CuttingRecTempRequest request, @Param("processCode") String processCode, @Param("companyId") String companyId);

    /**
     * 冲裁账目号码和数量数据
     * @param request 查询条件
     * @param companyId 公司id
     * @return 冲裁账目号码和数量数据
     */
    List<Map<String, Object>> accountSizeQtyQuery(@Param("request") CuttingPartRequest request, @Param("companyId") String companyId);

    /**
     * 查询冲裁明细
     * @param lotNo
     * @param companyId
     */
    List<PcCuttingLsPart> getProcessTodetail(String lotNo, String companyId);

    /**
     * 写入
     * @param detail
     */
    void addPcCuttingLsPartList(List<PcCuttingLsPart> detail);

    /**
     * 收发料表单回显查询
     *
     * @param request     查询调价
     * @param processCode 工艺类型
     * @param companyId
     * @return 收发料表单
     */
    List<CuttingRecDetDto> cuttingRecIoTempBack(@Param("request") CuttingRceIoBackRequest request, @Param("processCode") String processCode, @Param("companyId") String companyId);

    /**
     * 冲裁收发料表指令明细查询
     * @param request 查询条件
     * @param processNo 工序
     * @param companyId 公司id
     * @return 冲裁收发料表指令明细
     */
    List<CutScanLotDto> cuttingScanCodeQuery(@Param("request") CuttingPartRequest request, @Param("processNo") String processNo, @Param("companyId") String companyId);

    /**
     * 冲裁配套明细查询
     * @param lotNo 指令
     * @param companyId 公司公司id
     * @return 冲裁配套明细
     */
    List<PcCuttingPartSpDto> queryCuttingPartSpDetail(@Param("lotNo") String lotNo, @Param("companyId") String companyId);

    /**
     * 部位已制明细
     *
     * @param lotNo       指令
     * @param processCode 工序
     * @param spFlag      配套标志
     * @param sizeNo      号码
     * @param companyId   公司id
     * @return 部位已制明细
     */
    List<PcCuttingPartSpDto> queryCuttingGropByPart(@Param("lotNo") String lotNo, @Param("processCode") String processCode, @Param("sizeNo") String sizeNo, @Param("spFlag") Integer spFlag, @Param("companyId") String companyId);

    int addPcCuttingLsPart(@Param("companyId") String companyId, @Param("lotNo") String lotNo, @Param("partName") String partName);

    int addPcCuttingLsPart2(@Param("companyId") String companyId, @Param("lotNo") String lotNo, @Param("partName") String partName, @Param("processCode") String processCode);

    int addPcCuttingLsPartBk(@Param("lotNo") String lotNo, @Param("userName") String userName, @Param("version") int version);

    int addPcCuttingLsPart3(@Param("companyId") String companyId, @Param("lotNo") String lotNo);

    List<PcCuttingLsPart> getPcCuttingLsPartBkList(@Param("lotNo") String lotNo, @Param("version") int version);

    List<PcCuttingLsPart> getPcCuttingLsPartList(@Param("lotNo") String lotNo, @Param("companyId") String companyId);

    int updatePcCuttingLsPartByProdQty(@Param("lotNo") String lotNo, @Param("companyId") String companyId, @Param("sizeNo") String sizeNo,
                                        @Param("partName") String partName, @Param("processCode") String processCode, @Param("lsNo") int lsNo, @Param("qty") Integer qty);

    List<PcCuttingLsPart> getPcCuttingLsPartBkList2(@Param("lotNo") String lotNo, @Param("version") int version);

    List<PcCuttingLsPart> getPcCuttingLsPartList2(@Param("lotNo") String lotNo, @Param("companyId") String companyId);

    void updatePcCuttingLsPartBySendQty(@Param("lotNo") String lotNo, @Param("companyId") String companyId, @Param("sizeNo") String sizeNo,
                                        @Param("partName") String partName, @Param("processCode") String processCode, @Param("lsNo") int lsNo, @Param("qty") Integer qty);

    /**
     * 收发料超量查询
     *
     * @param processCode 工序
     * @param request     查询明细
     * @param companyId   公司ID
     * @return 任意一条收发数量超出额定数量的数据
     */
    PcCuttingLsPart remainQtyAfterIo(@Param("processCode") String processCode, @Param("request") List<PcCuttingCollectDetail> request, @Param("companyId") String companyId);

    /**
     * 获取前置工艺未完成的数据
     *
     * @param processCode 工序
     * @param request     查询明细
     * @param companyId   公司ID
     * @return 任意一条前置工艺未完成的数据
     */
    PcCuttingLsPart unFinPrecode(@Param("processCode") String processCode, @Param("request") List<PcCuttingCollectDetail> request, @Param("companyId") String companyId);

    /**
     * 发料前置完成度检测
     *
     * @param processCode 工序
     * @param labelNo     标签
     * @param companyId   公司ID
     * @return 任意一条前置未完成的数据
     */
    Integer sendUnFinPrecode(@Param("processCode") String processCode, @Param("labelNo") String labelNo, @Param("companyId") String companyId);

    /**
     * 收料前置工艺判断
     * @param lastProcessCode 前置工艺
     * @param labelNo 标签
     * @param companyId 公司ID
     * @return
     */
    Integer recUnFinPrecode(@Param("lastProcessCode") String lastProcessCode, @Param("labelNo") String labelNo, @Param("companyId") String companyId);

    /**
     * 获取前置最大工艺
     * @param processCode 工序
     * @param detail 查询明细
     * @param companyId 公司ID
     * @return 前置最大工艺
     */
    String getLastProcessCode(@Param("processCode") String processCode, @Param("detail") PcCuttingCollectDetail detail, @Param("companyId") String companyId);

    /**
     * 判断是否存在工艺
     * @param processCode 工序
     * @param detail 查询明细
     * @param companyId 公司ID
     * @return 存在数量
     */
    Integer findProcess(@Param("processCode") String processCode, @Param("detail") PcCuttingCollectDetail detail, @Param("companyId") String companyId);
}
